#ifndef _GFX_ENGINE_H_
#define _GFX_ENGINE_H_

#include "GL/glfw.h"

#define VIEWPORT_WIDTH 32.0f
#define VIEWPORT_HEIGHT 24.0f

#define RAD_TO_DEG(x) (180.0f*x/3.141592653589793238462643383279502884197169399375105820974944592)


#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

#include "../client/state.h"
#include "../client/console.h"
#include "../game/physics/world.h"
#include "../common/utils.h"

#include "font.h"
#include "textures.h"
#include "particle_engine.h"

#include <string.h>

class Utils;
class GameState;
class Console;
class World;
class Variables;
class WorldArea;
class WorldPlayer;
class WorldEntity;
class WorldProjectile;

extern GameState *gameState;
extern Console *console;
extern double timeLapsed;
extern Variables *variables;

class GFXEngine
{
	private:
		TextureManager *m_textureManager;
		FontManager *m_fontManager;
		ParticleEngine *m_particleEngine;
	
		GLfloat m_consoleY;
		
		/*funzioni specializzate in base allo stato */
		void drawGame(World *world, double delta);
		void drawEditor(World *world, double delta);
		
		/* disegna la console, da chiamare praticamente sempre visto che
		 * non fa' una sega se la console non e' mostrata 
		 */
		void drawConsole(double delta);
		
		/* stampa del testo a schermo, i parametri sono la posizione iniziale del
		 * primo carattere, la stringa e il tipo di font
		 */
		void drawString(GLfloat x, GLfloat y, char *str, int type);
		
	public:
		GFXEngine(void);
		~GFXEngine(void);
		
		void initEngine(void);
		void termEngine(void);

		void drawEntities(World *world, double delta);
		void drawEntity(WorldPlayer *entity, double delta);
		void drawEntity(WorldArea *entity, double delta);
		void drawEntity(WorldProjectile *entity, double delta);
		void draw(World *world, double delta);
		
		friend class ParticleEngine;
		friend class ExplosionPE;
		
		/* posizione del viewport (centro) */
		float m_viewportX, m_viewportY;
};

#endif
